﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;

namespace BLL
{
    public class HoaDonNhapBUO:IBUO<tbl_HoaDonNhap>
    {
        CSDLBanHangDataContext context = new CSDLBanHangDataContext();
        public bool Insert(tbl_HoaDonNhap obj)
        {
            try
            {
                context.tbl_HoaDonNhaps.InsertOnSubmit(obj);
                context.SubmitChanges();
                return true;
            }
            catch (Exception)
            {

                return false;
            }
        }
        /// <summary>
        /// Thêm chi tiết hóa đơn nhập hàng
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public bool Insert(tbl_HoaDonNhap_Hang obj)
        {
            try
            {
                context.tbl_HoaDonNhap_Hangs.InsertOnSubmit(obj);
                context.SubmitChanges();
                return true;
            }
            catch (Exception)
            {

                return false;
            }
        }
        /// <summary>
        /// Xóa hóa đơn nhập hàng
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public bool Delete(String id)
        {
            try
            {
                tbl_HoaDonNhap obj = context.tbl_HoaDonNhaps.Where(n => n.id_HoaDonNhap.Equals(id)).ToList<tbl_HoaDonNhap>().FirstOrDefault();
                if (obj != null)
                {
                    context.tbl_HoaDonNhaps.DeleteOnSubmit(obj);
                    context.SubmitChanges();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {

                return false;
            }
        }
        /// <summary>
        /// Xóa hàng ra khỏi hóa đơn nhập hàng
        /// </summary>
        /// <param name="idHDNhap"></param>
        /// <param name="idHang"></param>
        /// <returns></returns>
        public bool Delete(String idHDNhap, String idHang)
        {
            try
            {
                //tbl_HoaDonNhap_Hang obj = context.tbl_HoaDonNhap_Hangs.Where(n => n.id_HoaDonNhap.Trim().Equals(idHDNhap.Trim()) && n.id_Hang.Trim().Equals(idHang.Trim())).ToList<tbl_HoaDonNhap_Hang>().FirstOrDefault();
                tbl_HoaDonNhap_Hang obj = context.tbl_HoaDonNhap_Hangs.Where(n => n.id_HoaDonNhap.Trim().Equals(idHDNhap.Trim()) && n.id_Hang.Trim().Equals(idHang.Trim())).ToList<tbl_HoaDonNhap_Hang>().FirstOrDefault();
                if (obj != null)
                {
                    context.tbl_HoaDonNhap_Hangs.DeleteOnSubmit(obj);
                    context.SubmitChanges();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {

                return false;
            }
        }
        public bool Delete(tbl_HoaDonNhap obj)
        {
            throw new NotImplementedException();
        }

        public List<tbl_HoaDonNhap> GetAll()
        {
            return context.tbl_HoaDonNhaps.OrderByDescending(n => n.id_HoaDonNhap).ToList<tbl_HoaDonNhap>();
        }

        public tbl_HoaDonNhap GetSingle(String id)
        {
            throw new NotImplementedException();
        }

        public bool Update(String id, tbl_HoaDonNhap obj)
        {
            throw new NotImplementedException();
        }

        public bool Update(String idHDNhap,String id, tbl_HoaDonNhap_Hang obj)
        {
            tbl_HoaDonNhap_Hang tbl = context.tbl_HoaDonNhap_Hangs.Where(p => p.id_HoaDonNhap.Equals(idHDNhap)&& p.id_Hang.Equals(id)).FirstOrDefault();
            tbl.SoLuong = obj.SoLuong;

            context.SubmitChanges();
            return true;
        }
        /// <summary>
        /// Hiển thị chi tiết hóa đơn nhập hàng
        /// </summary>
        /// <param name="idHoaDonNhapHang"></param>
        /// <returns></returns>
        public IQueryable ChiTietHoaDonNhapHang(String idHoaDonNhapHang)
        {
            var list = context.tbl_HoaDonNhaps.Join(
                    context.tbl_HoaDonNhap_Hangs,
                    a => a.id_HoaDonNhap,
                    b => b.id_HoaDonNhap,
                    (a, b) => new
                    {
                        id_HoaDonNhap = a.id_HoaDonNhap,
                        id_Hang = b.id_Hang,
                        SoLuong = b.SoLuong,
                        NgayNhap = a.NgayNhap
                    }
                ).Join(
                    context.tbl_Hangs,
                    c => c.id_Hang,
                    d => d.id_Hang,
                    (c, d) => new
                    {
                        id_HoaDonNhap = c.id_HoaDonNhap,
                        id_Hang = c.id_Hang,
                        TenHang = d.TenHang,
                        DonGia = d.DonGia,
                        SoLuong = c.SoLuong,
                        NgayNhap = c.NgayNhap
                    }
                ).Join(
                    context.tbl_NCC_Hangs,
                    f => f.id_Hang,
                    g => g.id_Hang,
                    (f, g) => new
                    {
                        id_HoaDonNhap = f.id_HoaDonNhap,
                        id_Hang = f.id_Hang,
                        id_NhaCungCap = g.id_NhaCungCap,
                        TenHang = f.TenHang,
                        DonGia = f.DonGia,
                        SoLuong = f.SoLuong,
                        NgayNhap = f.NgayNhap
                    }

                ).Join(
                    context.tbl_NhaCungCaps,
                    h => h.id_NhaCungCap,
                    k => k.id_NhaCungCap,
                    (h, k) => new
                    {
                        id_HoaDonNhap = h.id_HoaDonNhap,
                        id_Hang = h.id_Hang,
                        id_NhaCungCap = h.id_NhaCungCap,
                        TenHang = h.TenHang,
                        TenNhaCungCap=k.TenNhaCungCap,
                        DonGia = h.DonGia,
                        SoLuong = h.SoLuong,
                        ThanhTien=h.SoLuong*h.DonGia,
                        NgayNhap = h.NgayNhap
                    }
                ).Where(n => n.id_HoaDonNhap.Trim().Equals(idHoaDonNhapHang.Trim()));
            return list;
        }
        /// <summary>
        /// Tìm hàng hóa trong hóa đơn nhập theo tên hàng
        /// </summary>
        /// <param name="tenhang"></param>
        /// <returns></returns>
        public IQueryable SearchByTenHang(String tenhang,String idHoaDonNhap)
        {
            var list = context.tbl_HoaDonNhaps.Join(
                    context.tbl_HoaDonNhap_Hangs,
                    a => a.id_HoaDonNhap,
                    b => b.id_HoaDonNhap,
                    (a, b) => new
                    {
                        id_HoaDonNhap = a.id_HoaDonNhap,
                        id_Hang = b.id_Hang,
                        SoLuong = b.SoLuong,
                        NgayNhap = a.NgayNhap
                    }
                ).Join(
                    context.tbl_Hangs,
                    c => c.id_Hang,
                    d => d.id_Hang,
                    (c, d) => new
                    {
                        id_HoaDonNhap = c.id_HoaDonNhap,
                        id_Hang = c.id_Hang,
                        TenHang = d.TenHang,
                        DonGia = d.DonGia,
                        SoLuong = c.SoLuong,
                        NgayNhap = c.NgayNhap
                    }
                ).Join(
                    context.tbl_NCC_Hangs,
                    f => f.id_Hang,
                    g => g.id_Hang,
                    (f, g) => new
                    {
                        id_HoaDonNhap = f.id_HoaDonNhap,
                        id_Hang = f.id_Hang,
                        id_NhaCungCap = g.id_NhaCungCap,
                        TenHang = f.TenHang,
                        DonGia = f.DonGia,
                        SoLuong = f.SoLuong,
                        NgayNhap = f.NgayNhap
                    }

                ).Join(
                    context.tbl_NhaCungCaps,
                    h => h.id_NhaCungCap,
                    k => k.id_NhaCungCap,
                    (h, k) => new
                    {
                        id_HoaDonNhap = h.id_HoaDonNhap,
                        id_Hang = h.id_Hang,
                        id_NhaCungCap = h.id_NhaCungCap,
                        TenHang = h.TenHang,
                        TenNhaCungCap = k.TenNhaCungCap,
                        DonGia = h.DonGia,
                        SoLuong = h.SoLuong,
                        NgayNhap = h.NgayNhap
                    }
                ).Where(n => n.TenHang.Trim().Contains(tenhang) && n.id_HoaDonNhap.Equals(idHoaDonNhap));
            return list;
        }
        /// <summary>
        /// Tìm kiếm hóa đơn nhập theo mã số hóa đơn
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public IQueryable SearchByMaHoaDonNhap(String id)
        {
            var list = context.tbl_HoaDonNhaps.Join(
                context.tbl_NhanViens,
                a => a.id_NhanVien,
                b => b.id_NhanVien,
                (a, b) => new
                {
                    id_HoaDonNhap = a.id_HoaDonNhap,
                    TenNhanVien = b.TenNhanVien,
                    NgayNhap = a.NgayNhap
                }
                ).Join(
                context.tbl_HoaDonNhap_Hangs,
                c => c.id_HoaDonNhap,
                d => d.id_HoaDonNhap,
                (c, d) => new
                {
                    id_HoaDonNhap = c.id_HoaDonNhap,
                    id_Hang = d.id_Hang,
                    TenNhanVien = c.TenNhanVien,
                    NgayNhap = c.NgayNhap
                }
                ).Join(
                context.tbl_Hangs,
                f => f.id_Hang,
                g => g.id_Hang,
                (f, g) => new
                {
                    id_HoaDonNhap = f.id_HoaDonNhap,
                    id_Hang = f.id_Hang,
                    TenNhanVien = f.TenNhanVien,
                    NgayNhap = f.NgayNhap
                }
                ).Join(
                context.tbl_NCC_Hangs,
                h => h.id_Hang,
                k => k.id_Hang,
                (h, k) => new
                {
                    id_HoaDonNhap = h.id_HoaDonNhap,
                    id_NhaCungCap = k.id_NhaCungCap,
                    id_Hang = h.id_Hang,
                    TenNhanVien = h.TenNhanVien,
                    NgayNhap = h.NgayNhap
                }
                ).Join(
                context.tbl_NhaCungCaps,
                m => m.id_NhaCungCap,
                n => n.id_NhaCungCap,
                (m, n) => new
                {
                    id_HoaDonNhap = m.id_HoaDonNhap,
                    TenNhaCungCap = n.TenNhaCungCap,
                    TenNhanVien = m.TenNhanVien,
                    NgayNhap = m.NgayNhap
                }
                ).Where(o => o.id_HoaDonNhap.Contains(id.Trim()));
            return list;
        }
        /// <summary>
        /// Tìm kiếm danh sách hóa đơn nhập theo tên nhà cung cấp
        /// </summary>
        /// <param name="ncc"></param>
        /// <returns></returns>
        public IQueryable SearchByNhaCungCap(String ncc)
        {
            var list = context.tbl_HoaDonNhaps.Join(
                context.tbl_NhanViens,
                a => a.id_NhanVien,
                b => b.id_NhanVien,
                (a, b) => new
                {
                    id_HoaDonNhap = a.id_HoaDonNhap,
                    TenNhanVien = b.TenNhanVien,
                    NgayNhap = a.NgayNhap
                }
                ).Join(
                context.tbl_HoaDonNhap_Hangs,
                c => c.id_HoaDonNhap,
                d => d.id_HoaDonNhap,
                (c, d) => new
                {
                    id_HoaDonNhap = c.id_HoaDonNhap,
                    id_Hang = d.id_Hang,
                    TenNhanVien = c.TenNhanVien,
                    NgayNhap = c.NgayNhap
                }
                ).Join(
                context.tbl_Hangs,
                f => f.id_Hang,
                g => g.id_Hang,
                (f, g) => new
                {
                    id_HoaDonNhap = f.id_HoaDonNhap,
                    id_Hang = f.id_Hang,
                    TenNhanVien = f.TenNhanVien,
                    NgayNhap = f.NgayNhap
                }
                ).Join(
                context.tbl_NCC_Hangs,
                h => h.id_Hang,
                k => k.id_Hang,
                (h, k) => new
                {
                    id_HoaDonNhap = h.id_HoaDonNhap,
                    id_NhaCungCap = k.id_NhaCungCap,
                    id_Hang = h.id_Hang,
                    TenNhanVien = h.TenNhanVien,
                    NgayNhap = h.NgayNhap
                }
                ).Join(
                context.tbl_NhaCungCaps,
                m => m.id_NhaCungCap,
                n => n.id_NhaCungCap,
                (m, n) => new
                {
                    id_HoaDonNhap = m.id_HoaDonNhap,
                    TenNhaCungCap = n.TenNhaCungCap,
                    TenNhanVien = m.TenNhanVien,
                    NgayNhap = m.NgayNhap
                }
                ).Where(o => o.TenNhaCungCap.Contains(ncc));
            return list;
        }

        public IQueryable SearchByNgayThang(DateTime dt)
        {
            var list = context.tbl_HoaDonNhaps.Join(
                context.tbl_NhanViens,
                a => a.id_NhanVien,
                b => b.id_NhanVien,
                (a, b) => new
                {
                    id_HoaDonNhap = a.id_HoaDonNhap,
                    TenNhanVien = b.TenNhanVien,
                    NgayNhap = a.NgayNhap
                }
                ).Join(
                context.tbl_HoaDonNhap_Hangs,
                c => c.id_HoaDonNhap,
                d => d.id_HoaDonNhap,
                (c, d) => new
                {
                    id_HoaDonNhap = c.id_HoaDonNhap,
                    id_Hang = d.id_Hang,
                    TenNhanVien = c.TenNhanVien,
                    NgayNhap = c.NgayNhap
                }
                ).Join(
                context.tbl_Hangs,
                f => f.id_Hang,
                g => g.id_Hang,
                (f, g) => new
                {
                    id_HoaDonNhap = f.id_HoaDonNhap,
                    id_Hang = f.id_Hang,
                    TenNhanVien = f.TenNhanVien,
                    NgayNhap = f.NgayNhap
                }
                ).Join(
                context.tbl_NCC_Hangs,
                h => h.id_Hang,
                k => k.id_Hang,
                (h, k) => new
                {
                    id_HoaDonNhap = h.id_HoaDonNhap,
                    id_NhaCungCap = k.id_NhaCungCap,
                    id_Hang = h.id_Hang,
                    TenNhanVien = h.TenNhanVien,
                    NgayNhap = h.NgayNhap
                }
                ).Join(
                context.tbl_NhaCungCaps,
                m => m.id_NhaCungCap,
                n => n.id_NhaCungCap,
                (m, n) => new
                {
                    id_HoaDonNhap = m.id_HoaDonNhap,
                    TenNhaCungCap = n.TenNhaCungCap,
                    TenNhanVien = m.TenNhanVien,
                    NgayNhap = m.NgayNhap
                }
                ).Where(o => DateTime.Compare((DateTime)o.NgayNhap,dt)==0);
            return list;
        }
        /// <summary>
        /// Liệt kê danh sách hóa đơn nhập hàng
        /// </summary>
        /// <returns></returns>
        public IQueryable GetAllHDNhap()
        {
            var list = context.tbl_HoaDonNhaps.Join(
                context.tbl_NhanViens,
                a => a.id_NhanVien,
                b => b.id_NhanVien,
                (a, b) => new
                {
                    id_HoaDonNhap = a.id_HoaDonNhap,
                    TenNhanVien = b.TenNhanVien,
                    NgayNhap = a.NgayNhap
                }
                ).Join(
                context.tbl_HoaDonNhap_Hangs,
                c => c.id_HoaDonNhap,
                d => d.id_HoaDonNhap,
                (c, d) => new
                {
                    id_HoaDonNhap = c.id_HoaDonNhap,
                    id_Hang = d.id_Hang,
                    TenNhanVien = c.TenNhanVien,
                    NgayNhap = c.NgayNhap
                }
                ).Join(
                context.tbl_Hangs,
                f => f.id_Hang,
                g => g.id_Hang,
                (f, g) => new
                {
                    id_HoaDonNhap = f.id_HoaDonNhap,
                    id_Hang = f.id_Hang,
                    TenNhanVien = f.TenNhanVien,
                    NgayNhap = f.NgayNhap
                }
                ).Join(
                context.tbl_NCC_Hangs,
                h => h.id_Hang,
                k => k.id_Hang,
                (h, k) => new
                {
                    id_HoaDonNhap = h.id_HoaDonNhap,
                    id_NhaCungCap = k.id_NhaCungCap,
                    id_Hang = h.id_Hang,
                    TenNhanVien = h.TenNhanVien,
                    NgayNhap = h.NgayNhap
                }
                ).Join(
                context.tbl_NhaCungCaps,
                m => m.id_NhaCungCap,
                n => n.id_NhaCungCap,
                (m, n) => new
                {
                    id_HoaDonNhap = m.id_HoaDonNhap,
                    TenNhaCungCap=n.TenNhaCungCap,                    
                    TenNhanVien = m.TenNhanVien,
                    NgayNhap = m.NgayNhap
                }
                ).OrderByDescending(p=>p.id_HoaDonNhap);
            return list;
        }
    }
}
